<!-- 封装组件代码 -->
<template>
  <ul class="table-right-menu">
    <!-- 循环菜单项，事件带参数抛出 -->
    <li v-for="item in rightclickInfo.menulists" :key="item.btnName" class="table-right-menu-item"
      @click.stop="fnHandler(item)">
      <div class="table-right-menu-item-btn">
        <!-- 图标和按钮名 -->
        <i :class="item.icoName" class="iii" />
        <span>{{ item.btnName }}</span>
      </div>
    </li>
  </ul>
</template>

<script>
export default {
  name: "myRightMenu",
  props: {
    // 接收右键点击的信息
    rightclickInfo: {
      type: Object,
      default: () => {
        return {
          position: {
            // 右键点击的位置
            x: null,
            y: null,
          },
          menulists: [
            {
              fnName: "", // 点击菜单项的事件名
              params: {}, // 点击的参数
              icoName: "", // 图标名
              btnName: "", // 按钮名
            },
          ],
        };
      },
    },
    // 重要参数，用于标识是哪个右键菜单dom元素
    classIndex: {
      type: Number,
      default: 0,
    },
  },
  watch: {
    // 监听右键点击时点击位置的变化，只要变化了，就弹出右键菜单供用户点击操作
    "rightclickInfo.position"(val) {
      let x = val.x; // 获取x轴坐标
      let y = val.y; // 获取y轴坐标
      let innerWidth = window.innerWidth; // 获取页面可是区域宽度，即页面的宽度
      let innerHeight = window.innerHeight; // 获取可视区域高度，即页面的高度
      let menu = document.getElementsByClassName("table-right-menu")[this.classIndex]; 
      menu.style.display = "block";
      let menuHeight = this.rightclickInfo.menulists.length * 30; // 菜单容器高
      let menuWidth = 180; // 菜单容器宽
      // 菜单的位置计算
      menu.style.top = (y + menuHeight > innerHeight ? innerHeight - menuHeight : y) + "px";
      menu.style.left = (x + menuWidth > innerWidth ? innerWidth - menuWidth : x) + "px";
      // 因为菜单还要关闭，就绑定一个鼠标点击事件，通过e.button判断点击的是否是左键，左键关闭菜单
      document.addEventListener("mouseup", this.hide, false);
    },
  },
  methods: {
    hide(e) {
      if (e.button === 0) {
        let menu = document.getElementsByClassName("table-right-menu")[this.classIndex];
        menu.style.display = "none"; // 菜单关闭
        document.removeEventListener("mouseup", this.hide); // 及时解绑监听事件
      }
    },
    fnHandler(item) {
      this.$emit(item.fnName, item.params);
      // 事件再传出去，即为：
      // this.$emit('事件名',事件参数)
    },
  },
};
</script>